#include <sys/socket.h>	/* socket AF_UNIX SOCK_STREAM sockaddr connect */
#include <sys/un.h>		/* sockaddr_un */
#include <stdio.h>		/* perror printf */
#include <string.h>		/* strcpy */
#include <unistd.h>		/* unlink read write close */
#include "comm.h"

#define CLIENT_STRING1 "Client say hello world!"
#define CLIENT_STRING2 "My name is client"
#define CLIENT_STRING3 "e(exit). I will close server"

static char recv_buf[RECV_BUF_SIZE];

int main(void)
{
	struct sockaddr_un srv_addr;	/* 服务器域套接字地址 */
	struct sockaddr_un clt_addr; 
	int connect_fd;
	int ret, len;

	/* 打开一个套接字，地址族协议：本地IPC通信（非ipv4或ipv4），
	   套接字类型：流，使用的协议：无（非TCP或UDP） */
	connect_fd = socket(AF_UNIX, SOCK_STREAM, 0);
	if (connect_fd < 0) {
		perror("socket");
		return -1;
	}

	srv_addr.sun_family = AF_UNIX;	/* 本机IPC通信 */
	strcpy(srv_addr.sun_path, SOCKET_FILE);	/* 使用虚拟内存文件 */
	
	/* 握手和连接服务器端，非阻塞，如果连不上服务器则直接报错 */
	ret = connect(connect_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr));
	if (ret < 0) {
		perror("connect");
		goto exit;
	}

	/* 收发数据 */
	write(connect_fd, CLIENT_STRING1, sizeof(CLIENT_STRING1));
	len = read(connect_fd, recv_buf, sizeof(recv_buf));
	if (len > 0) {
		recv_buf[len] = '\0';
		printf("client<==server[%d]: %s\n", len, recv_buf);
	}

	write(connect_fd, CLIENT_STRING2, sizeof(CLIENT_STRING2));
	len = read(connect_fd, recv_buf, sizeof(recv_buf));
	if (len > 0) {
		recv_buf[len] = '\0';
		printf("client<==server[%d]: %s\n", len, recv_buf);
	}

	write(connect_fd, CLIENT_STRING3, sizeof(CLIENT_STRING3));

exit:
	/* 关闭套接字 */
	close(connect_fd);

	return 0;
}
